package com.ruoyi.system.api;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.factory.RemoteOssServiceFallbackFactory;

import java.util.List;

/**
 * OSS文件服务
 * 
 * @author ruoyi
 */
@FeignClient(contextId = "remoteOssService", value = ServiceNameConstants.FILE_SERVICE, fallbackFactory = RemoteOssServiceFallbackFactory.class)
public interface RemoteOssService
{
    /**
     * 上传单个文件到OSS
     * 
     * @param file 文件
     * @return 结果
     */
    @PostMapping(value = "/oss/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public R<Object> uploadFile(@RequestPart("file") MultipartFile file);

    /**
     * 批量上传文件到OSS
     * 
     * @param files 文件列表
     * @return 结果
     */
    @PostMapping(value = "/oss/uploads", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public R<Object> uploadFiles(@RequestPart("files") List<MultipartFile> files);

    /**
     * 删除OSS文件
     * 
     * @param fileUrl 文件URL
     * @return 结果
     */
    @DeleteMapping("/oss/delete")
    public R<Object> deleteFile(@RequestParam("fileUrl") String fileUrl);

    /**
     * 检查文件是否存在
     * 
     * @param fileUrl 文件URL
     * @return 结果
     */
    @GetMapping("/oss/exists")
    public R<Object> checkFileExists(@RequestParam("fileUrl") String fileUrl);

    /**
     * 获取文件访问URL
     * 
     * @param fileName 文件名
     * @return 结果
     */
    @GetMapping("/oss/url")
    public R<Object> getFileUrl(@RequestParam("fileName") String fileName);

    /**
     * 获取带签名的文件访问URL（临时访问）
     * 
     * @param fileName 文件名
     * @param expireTime 过期时间（秒）
     * @return 结果
     */
    @GetMapping("/oss/signed-url")
    public R<Object> getSignedUrl(@RequestParam("fileName") String fileName, 
                                 @RequestParam(value = "expireTime", defaultValue = "3600") long expireTime);

    /**
     * 批量上传文件到OSS（拼接版本）
     */
    @PostMapping(value = "/oss/uploadsP", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public R<Object> uploadFilesForDatabase(@RequestParam("files") List<MultipartFile> files,
                                            @RequestParam(value = "separator", defaultValue = "|") String separator);
}